home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 37 / IOPROG_37.ISO / SOFT / Multilizer.exe / disk1 / data1.cab / data1 / [Group9]VCL Source Standard / ivbindic.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1999-08-12  |  12.0 KB  |  514 lines

  1. unit IvBinDic;
  2.  
  3. {$I IVMULTI.INC}
  4.  
  5. interface
  6.  
  7. uses
  8. {$IFDEF WIN32}
  9.   Windows,
  10. {$ELSE}
  11.   WinTypes, WinProcs,
  12. {$ENDIF}
  13.   SysUtils, Classes,
  14.   IvDictio, IvAMulti, IvMLDFil;
  15.  
  16. const
  17.   DICTIONARY_RESOURCE_C = 'MlDictionary';
  18.  
  19. type
  20.   TIvBinaryDictionary = class(TIvCustomFileDictionary)
  21.   protected
  22. {$IFDEF IVVB}
  23.     { OCX must read the whole content of these properties,
  24.       because the property stream is available only once. }
  25.     FAllLanguages: TList;
  26.     FAllLocales: TList;
  27.     FAllTranslations: TMemoryStream;
  28. {$ENDIF}
  29.     FFile: TIvMLDFile;
  30.     FLanguageCount: Integer;
  31.     FTranslationCount: Integer;
  32.     FLocaleCount: Integer;
  33.  
  34.     procedure ReadLanguages(reader: TReader); virtual;
  35.     procedure WriteLanguages(writer: TWriter);
  36.  
  37.     procedure ReadTranslations(reader: TReader); virtual;
  38.     procedure WriteTranslations(writer: TWriter);
  39.  
  40.     procedure ReadLocales(reader: TReader); virtual;
  41.     procedure WriteLocales(writer: TWriter);
  42.  
  43.     procedure DefineProperties(filer: TFiler); override;
  44.  
  45.     procedure OpenFile;
  46.     procedure CloseFile;
  47.  
  48.     function GetLanguageCount: Integer; override;
  49.     function GetTranslationCount: Integer; override;
  50.     procedure GetLanguageData(index: Integer; language: TIvLanguage); override;
  51.     function GetLocaleCount: Integer; override;
  52.     procedure GetLocaleData(index: Integer; locale: TIvLocale); override;
  53.     procedure LoadTranslation; override;
  54.  
  55.   public
  56. {$IFDEF IVVB}
  57.     constructor Create(owner: TComponent); override;
  58.     destructor Destroy; override;
  59. {$ENDIF}
  60.  
  61.     procedure GetLanguageDatas(list: TList); override;
  62.     procedure GetLocaleDatas(list: TList); override;
  63.   end;
  64.  
  65. implementation
  66.  
  67. uses
  68. {$IFDEF IVVB}
  69.   MultiOCX,   { VBEmbeddedXXX methods }
  70. {$ENDIF}
  71.   IvMlRead, IvReader;
  72.  
  73. {$IFDEF IVVB}
  74. constructor TIvBinaryDictionary.Create(owner: TComponent);
  75. begin
  76.   inherited Create(owner);
  77.  
  78.   FAllLanguages := TList.Create;
  79.   FAllLocales   := TList.Create;
  80.   FAllTranslations := TMemoryStream.Create;
  81. end;
  82.  
  83. destructor TIvBinaryDictionary.Destroy;
  84. begin
  85.   FreeList(FAllLanguages);
  86.   FreeList(FAllLocales);
  87.   FAllTranslations.Free;
  88.   inherited Destroy;
  89. end;
  90. {$ENDIF}
  91.  
  92. procedure TIvBinaryDictionary.ReadLanguages(reader: TReader);
  93. begin
  94. {$IFDEF IVVB}
  95.   if Storage = ivsEmbedded then
  96.     FLanguageCount := VBEmbeddedReadLanguages(reader, FAllLanguages)
  97.   else
  98. {$ENDIF}
  99.     FLanguageCount := TIvReader.SkipLanguages(reader);
  100. end;
  101.  
  102. procedure TIvBinaryDictionary.WriteLanguages(writer: TWriter);
  103. var
  104.   i: Integer;
  105.   mldFile: TIvMLDFile;
  106. begin
  107.   mldFile := TIvMLDFile.Create;
  108.   try
  109.     mldFile.OpenFile(FileName);
  110.  
  111.     writer.WriteListBegin;
  112.     writer.WriteInteger(LANGUAGES_VERSION_C);
  113.     writer.WriteInteger(mldFile.LanguageCount);
  114.     mldFile.GoLanguageSection;
  115.     for i := 0 to mldFile.LanguageCount - 1 do
  116.       TIvReader.WriteLanguage(writer, mldFile.GetCurrentLanguage);
  117.     writer.WriteListEnd;
  118.   finally
  119.     mldFile.Free;
  120.   end;
  121. end;
  122.  
  123. procedure TIvBinaryDictionary.ReadTranslations(reader: TReader);
  124. begin
  125. {$IFDEF IVVB}
  126.   if Storage = ivsEmbedded then
  127.     VBEmbeddedReadTranslations(reader, FLanguageCount, FAllTranslations)
  128.   else
  129. {$ENDIF}
  130.     FTranslationCount := TIvReader.SkipTranslations(reader, FLanguageCount);
  131. end;
  132.  
  133. procedure TIvBinaryDictionary.WriteTranslations(writer: TWriter);
  134. var
  135.   i, j: Integer;
  136.   row: TStringList;
  137.   mldFile: TIvMLDFile;
  138.   context: TIvContext;
  139. begin
  140.   mldFile := TIvMLDFile.Create;
  141.   context := TIvContext.Create;
  142.   try
  143.     mldFile.OpenFile(FileName);
  144.  
  145.     writer.WriteListBegin;
  146.     writer.WriteInteger(TRANSLATIONS_VERSION_C);
  147.     writer.WriteInteger(Integer(mldFile.ContextCode));
  148.     writer.WriteInteger(mldFile.TranslationCount);
  149.     mldFile.GoTranslationSection;
  150.     for i := 0 to mldFile.TranslationCount - 1 do
  151.     begin
  152.       row := TStringList.Create;
  153.       mldFile.GetTranslations(context, row);
  154.  
  155.       writer.WriteListBegin;
  156.       for j := 0 to row.Count - 1 do
  157.       begin
  158.         writer.WriteString(row[j]);
  159.         if j = 0 then
  160.         begin
  161.           if ivctForm in mldFile.ContextType then
  162.             writer.WriteString(context.Form);
  163.           if ivctComponent in mldFile.ContextType then
  164.             writer.WriteString(context.Component);
  165.         end;
  166.       end;
  167.       writer.WriteListEnd;
  168.  
  169.       row.Free;
  170.     end;
  171.     writer.WriteListEnd;
  172.   finally
  173.     context.Free;
  174.     mldFile.Free;
  175.   end;
  176. end;
  177.  
  178. procedure TIvBinaryDictionary.ReadLocales(reader: TReader);
  179. begin
  180. {$IFDEF IVVB}
  181.   if Storage = ivsEmbedded then
  182.     FLocaleCount := VBEmbeddedReadLocales(reader, FAllLocales)
  183.   else
  184. {$ENDIF}
  185.     FLocaleCount := TIvReader.SkipLocales(reader);
  186. end;
  187.  
  188. procedure TIvBinaryDictionary.WriteLocales(writer: TWriter);
  189. var
  190.   i: Integer;
  191.   mldFile: TIvMLDFile;
  192. begin
  193.   mldFile := TIvMLDFile.Create;
  194.   try
  195.     mldFile.OpenFile(FileName);
  196.  
  197.     writer.WriteListBegin;
  198.     writer.WriteInteger(LOCALES_VERSION_C);
  199.     writer.WriteInteger(mldFile.LocaleCount);
  200.     if mldFile.LocaleCount > 0 then
  201.     begin
  202.       mldFile.GoLocaleSection;
  203.       for i := 0 to mldFile.LocaleCount - 1 do
  204.         TIvReader.WriteLocale(writer, mldFile.GetCurrentLocale);
  205.     end;
  206.     writer.WriteListEnd;
  207.   finally
  208.     mldFile.Free;
  209.   end;
  210. end;
  211.  
  212. procedure TIvBinaryDictionary.DefineProperties(filer: TFiler);
  213. var
  214.   hasData: boolean;
  215.   mldFile: TIvMLDFile;
  216. {$IFNDEF WIN32}
  217.   buffer: array[0..255] of Char;
  218. {$ENDIF}
  219. begin
  220.   inherited DefineProperties(filer);
  221.  
  222.   if FStorage = ivsEmbedded then
  223.   begin
  224.     if filer is TReader then
  225.       hasData := True
  226.     else if FileName <> '' then
  227.     begin
  228.       hasData := False;
  229.       if not FileExists(FileName) then
  230.         MessageBox(
  231.           0,
  232. {$IFDEF WIN32}PChar({$ELSE}StrPCopy(buffer,{$ENDIF}
  233.           'Can not find the file name ' + fileName + '. No dictionary data was stored!'),
  234.           'File not found',
  235.           MB_OK)
  236.       else
  237.       begin
  238.         mldFile := TIvMLDFile.Create;
  239.         try
  240.           mldFile.OpenFile(fileName);
  241.           if mldFile.CharacterSet = ivcsUnicode then
  242.           begin
  243.             MessageBox(
  244.               0,
  245. {$IFDEF WIN32}PChar({$ELSE}StrPCopy(buffer,{$ENDIF}
  246.               'Can not use a Unicode MLD file ' + fileName + '. No dictionary data was stored!'),
  247.               'Unicode not supported',
  248.               MB_OK);
  249.           end
  250.           else
  251.             hasData := True;
  252.         finally
  253.           mldFile.Free;
  254.         end;
  255.       end;
  256.     end
  257.     else
  258.       hasData := False;
  259.  
  260.     filer.DefineProperty(LANGUAGES_C, ReadLanguages, WriteLanguages, hasData);
  261.     filer.DefineProperty(TRANSLATIONS_C, ReadTranslations, WriteTranslations, hasData);
  262.     filer.DefineProperty(LOCALES_C, ReadLocales, WriteLocales, hasData);
  263.   end;
  264. end;
  265.  
  266. procedure TIvBinaryDictionary.OpenFile;
  267. begin
  268.   if FFileName = '' then
  269.     raise Exception.Create('No FileName property set');
  270.  
  271.   FFile := TIvMLDFile.Create;
  272.   try
  273. {$IFDEF WIN32}
  274.     if (FStorage = ivsFile) or (IsDesignTime and FileExists(FileName)) then
  275. {$ENDIF}
  276.       FFile.Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone)
  277. {$IFDEF WIN32}
  278.     else
  279.       FFile.Stream := TResourceStream.Create(HInstance, DICTIONARY_RESOURCE_C, MULTILIZER_RES_TYPE_C)
  280. {$ENDIF}
  281.       ;
  282.     FFile.Open;
  283.     FContextType := FFile.ContextType;
  284.   except
  285.     FFile.Free;
  286.     raise;
  287.   end;
  288. end;
  289.  
  290. procedure TIvBinaryDictionary.CloseFile;
  291. begin
  292.   FFile.Free;
  293.   FFile := nil;
  294. end;
  295.  
  296. function TIvBinaryDictionary.GetLanguageCount: Integer;
  297. begin
  298.   if (FStorage = ivsFile) or
  299. {$IFDEF WIN32}
  300.     (FStorage = ivsResource) or
  301. {$ENDIF}
  302.     (IsDesignTime and FileExists(FileName)) then
  303.   begin
  304.     OpenFile;
  305.     try
  306.       Result := FFile.LanguageCount;
  307.     finally
  308.       CloseFile;
  309.     end;
  310.   end
  311.   else
  312.     Result := FLanguageCount;
  313. end;
  314.  
  315. function TIvBinaryDictionary.GetTranslationCount: Integer;
  316. begin
  317.   if (FStorage = ivsFile) or
  318. {$IFDEF WIN32}
  319.     (FStorage = ivsResource) or
  320. {$ENDIF}
  321.     (IsDesignTime and FileExists(FileName)) then
  322.   begin
  323.     OpenFile;
  324.     try
  325.       Result := FFile.TranslationCount;
  326.     finally
  327.       CloseFile;
  328.     end;
  329.   end
  330.   else
  331.     Result := FTranslationCount;
  332. end;
  333.  
  334. procedure TIvBinaryDictionary.GetLanguageData(index: Integer; language: TIvLanguage);
  335. begin
  336.   if (FStorage = ivsFile) or
  337. {$IFDEF WIN32}
  338.     (FStorage = ivsResource) or
  339. {$ENDIF}
  340.     (IsDesignTime and FileExists(FileName)) then
  341.   begin
  342.     OpenFile;
  343.     try
  344.       language.Assign(FFile.Languages[index]);
  345.     finally
  346.       CloseFile;
  347.     end;
  348.   end
  349.   else
  350. {$IFDEF IVVB}
  351.     VBEmbeddedGetLanguageData(index, language, FAllLanguages);
  352. {$ELSE}
  353.     TIvReader.GetLanguageData(Owner.ClassName, ClassName, Name, index, language);
  354. {$ENDIF}
  355. end;
  356.  
  357. procedure TIvBinaryDictionary.GetLanguageDatas(list: TList);
  358. var
  359.   i: Integer;
  360. begin
  361.   if (FStorage = ivsFile) or
  362. {$IFDEF WIN32}
  363.     (FStorage = ivsResource) or
  364. {$ENDIF}
  365.     (IsDesignTime and FileExists(FileName)) then
  366.   begin
  367.     OpenFile;
  368.     try
  369.       FFile.GoLanguageSection;
  370.       for i := 0 to FFile.LanguageCount - 1 do
  371.         list.Add(FFile.GetCurrentLanguage.Copy);
  372.     finally
  373.       CloseFile;
  374.     end;
  375.   end
  376.   else
  377. {$IFDEF IVVB}
  378.     VBEmbeddedGetLanguageDatas(list, FAllLanguages);
  379. {$ELSE}
  380.     TIvReader.GetLanguageDatas(Owner.ClassName, ClassName, Name, list);
  381. {$ENDIF}
  382. end;
  383.  
  384. function TIvBinaryDictionary.GetLocaleCount: Integer;
  385. begin
  386.   if (FStorage = ivsFile) or
  387. {$IFDEF WIN32}
  388.     (FStorage = ivsResource) or
  389. {$ENDIF}
  390.     (IsDesignTime and FileExists(FileName)) then
  391.   begin
  392.     OpenFile;
  393.     try
  394.       Result := FFile.LocaleCount;
  395.     finally
  396.       CloseFile;
  397.     end;
  398.   end
  399.   else
  400.     Result := FLocaleCount;
  401. end;
  402.  
  403. procedure TIvBinaryDictionary.GetLocaleData(index: Integer; locale: TIvLocale);
  404. begin
  405.   if (FStorage = ivsFile) or
  406. {$IFDEF WIN32}
  407.     (FStorage = ivsResource) or
  408. {$ENDIF}
  409.     (IsDesignTime and FileExists(FileName)) then
  410.   begin
  411.     OpenFile;
  412.     try
  413.       locale.Assign(FFile.Locales[index]);
  414.     finally
  415.       CloseFile;
  416.     end;
  417.   end
  418.   else
  419.     try
  420. {$IFDEF IVVB}
  421.       VBEmbeddedGetLocaleData(index, locale, FAllLocales);
  422. {$ELSE}
  423.       TIvReader.GetLocaleData(Owner.ClassName, ClassName, Name, index, locale);
  424. {$ENDIF}
  425.     except
  426.       raise EIvMulti.Create('No dictionary data! Set the FileName property.');
  427.     end;
  428. end;
  429.  
  430. procedure TIvBinaryDictionary.GetLocaleDatas(list: TList);
  431. var
  432.   i: Integer;
  433. begin
  434.   if (FStorage = ivsFile) or
  435. {$IFDEF WIN32}
  436.     (FStorage = ivsResource) or
  437. {$ENDIF}
  438.     (IsDesignTime and FileExists(FileName)) then
  439.   begin
  440.     OpenFile;
  441.     try
  442.       if FFile.LocaleCount > 0 then
  443.       begin
  444.         FFile.GoLocaleSection;
  445.         for i := 0 to FFile.LocaleCount - 1 do
  446.           list.Add(FFile.GetCurrentLocale.Copy);
  447.       end;
  448.     finally
  449.       CloseFile;
  450.     end;
  451.   end
  452.   else
  453.   begin
  454.     if FLocaleCount > 0 then
  455. {$IFDEF IVVB}
  456.       VBEmbeddedGetLocaleDatas(list, FAllLocales);
  457. {$ELSE}
  458.       TIvReader.GetLocaleDatas(Owner.ClassName, ClassName, Name, list);
  459. {$ENDIF}
  460.   end;
  461. end;
  462.  
  463. procedure TIvBinaryDictionary.LoadTranslation;
  464. var
  465.   i, codePage: Integer;
  466.   translation: TIvTranslation;
  467. begin
  468.   ClearTranslations;
  469.  
  470.   if (FStorage = ivsFile) or
  471. {$IFDEF WIN32}
  472.     (FStorage = ivsResource) or
  473. {$ENDIF}
  474.     (IsDesignTime and FileExists(FileName)) then
  475.   begin
  476.     OpenFile;
  477.     try
  478.       codePage := FLanguageData.CodePage;
  479.       FFile.GoTranslationSection;
  480.       for i := 0 to FFile.TranslationCount - 1 do
  481.       begin
  482.         translation := TIvTranslation.Create;
  483.         FFile.GetTranslation(translation, ActiveLanguage, codePage);
  484.         FTranslations.Add(translation);
  485.       end;
  486.     finally
  487.       CloseFile;
  488.     end;
  489.   end
  490.   else
  491.   begin
  492. {$IFDEF IVVB}
  493.     FContextType := VBEmbeddedLoadTranslation(
  494.       ActiveLanguage,
  495.       LanguageCount,
  496.       FTranslations,
  497.       FAllTranslations);
  498. {$ELSE}
  499.     FContextType := TIvReader.LoadTranslation(
  500.       Owner.ClassName,
  501.       ClassName,
  502.       Name,
  503.       ActiveLanguage,
  504.       LanguageCount,
  505.       FTranslations);
  506. {$ENDIF}
  507.   end;
  508.  
  509.   Sort;
  510. end;
  511.  
  512. end.
  513.  
  514.